<?php
namespace app\common\library;
use think\exception\HttpResponseException;
use think\Request;
use think\Response;

/**
 * 公用方法服务
*/

class Utils {
    /**
     * 操作成功返回的数据
     * @param string $msg   提示信息
     * @param mixed $data   要返回的数据
     * @param int   $code   错误码，默认为1
     * @param string $type  输出类型
     * @param array $header 发送的 Header 信息
     */
    public static function success($msg = '', $data = null, $code = 1, $type = null, array $header = [])
    {
        self::result($msg, $data, $code, $type, $header);
    }

    /**
     * 操作失败返回的数据
     * @param string $msg   提示信息
     * @param mixed $data   要返回的数据
     * @param int   $code   错误码，默认为0
     * @param string $type  输出类型
     * @param array $header 发送的 Header 信息
     */
    public static function error($msg = '', $data = null, $code = 0, $type = null, array $header = [])
    {
        self::result($msg, $data, $code, $type, $header);
    }
    /**
     * 返回封装后的 API 数据到客户端
     * @access protected
     * @param mixed  $msg    提示信息
     * @param mixed  $data   要返回的数据
     * @param int    $code   错误码，默认为0
     * @param string $type   输出类型，支持json/xml/jsonp
     * @param array  $header 发送的 Header 信息
     * @return void
     * @throws HttpResponseException
     */
    public static function result($msg, $data = null, $code = 0, $type = null, array $header = [])
    {
        if (!$data && $data !== '') {
            $data = [];
        }
        $result = [
            'code' => $code,
            'msg'  => $msg,
            'time' => Request::instance()->server('REQUEST_TIME'),
            'data' => $data,
        ];
        // 如果未设置类型则自动判断
        $type = $type ? $type : (input(config('var_jsonp_handler')) ? 'jsonp' : 'json');

        if (isset($header['statuscode']))
        {
            $code = $header['statuscode'];
            unset($header['statuscode']);
        }
        else
        {
            //未设置状态码,根据code值判断
            $code = $code >= 1000 || $code < 200 ? 200 : $code;
        }
        $response = Response::create($result, $type, $code)->header($header);
        throw new HttpResponseException($response);
    }
    /**
     * 字符串替换
     */
    public static function sr($str = '', $target = '', $content = ''){

        return str_replace($target, $content, $str);
    }

    /**
     * 时间戳格式化
     * @param int $time
     * @return string 格式化后的时间字符串
     */
    public static function time_format($time = NULL,$style='Y-m-d H:i:s'){
        if (empty($time) || $time == 0) {
            return '';
        }
        $time = $time === NULL ? '' : intval($time);
        return date($style, $time);
    }



    /**
     * 处理字符串
     */
    public static function explodeStr($str, $s = ',') {
        if ($str === '') {
            $arr = [];
        } else {
            $arr = explode($s, $str);
        }

        return $arr;
    }

    /**
     * 处理数组
     */
    public static function implodeArr($arr, $s = ',') {
        if (empty($arr)) {
            $str = '';
        } else {
            $str = implode($s, $arr);
        }

        return $str;
    }

    /**
     * 专门用来处理两个字符串 去除相同的部分 $str1返回
     */
    public static function deleteStrSame($str1, $str2) {
        $arr1 = self::explodeStr($str1);
        $arr2 = self::explodeStr($str2);
        $realArr = array_diff($arr1, $arr2);
        $realStr = self::implodeArr($realArr);

        return $realStr;
    }

    /**
     * 专门用来处理两个字符串 合并两个字符串
     */
    public static function combinStr($str1, $str2) {
        $arr1 = self::explodeStr($str1);
        $arr2 = self::explodeStr($str2);
        $realArr = array_flip($arr1) + array_flip($arr2);
        $realArr = array_keys($realArr);

        $realStr = self::implodeArr($realArr);

        return $realStr;
    }

    /*
     * 计算数组中元素的和
     * */
    public static function getArrHz($arr) {
        $hz = 0;
        foreach ($arr as $k => $v) {
            $hz += $v;
        }

        return $hz;
    }

    /*
     浮点数计算函数 取2位小数 后面舍去
     $user_money 用户余额
     $money 要处理的钱数
     $conn 连接符号
 */
    public static function processMoney($user_money, $money, $conn, $bcscale = 2) {
        $user_money = (string)$user_money;
        $money = (string)$money;
        $balance = '';
        bcscale($bcscale);
        switch ($conn) {
            case '-': $balance = bcsub($user_money, $money); return $balance; break;
            case '+': $balance = bcadd($user_money, $money); return $balance; break;
            case '*': $balance = bcmul($user_money, $money); return $balance; break;
            case '/': $balance = bcdiv($user_money, $money); return $balance; break;

            default: return ''; break;
        }
    }

    /** 从一个数组种随机几个元素*/
    public static function rankArray($arr = [], $num = 1) {
        if (empty($arr)) {
            return V(0, '数组成员不能为空');
        }
        if (count($arr) < $num) {
            return V(0, '数组元素数量小于要随机的数量');
        }

        $temp = [];
        for ($i = 1; $i <= $num; $i++) {
            array_push($temp, $arr[array_rand($arr, 1)]);
        }

        return $temp;
    }

    /**
        解析数组 主要是配置专用
     * @$value 为解析的字符串
     */
    public static function parse($value){
        $array = preg_split('/[,;\r\n]+/', trim($value, ",;\r\n"));

        if(strpos($value,':')){
            $value  = array();
            foreach ($array as $val) {
                list($k, $v) = explode(':', $val);
                $value[$k]   = $v;
            }
        }else{
            $value =    $array;
        }

        return $value;
    }

    /*
    * 彩票用来获取 开奖结果的
    * */
    public static function doCurl($url) {
        // 执行并获取内容
        $url = trim($url);
        $ch = curl_init(); // 初始化
        // 设置选项
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);

        if(stripos($url,'https') === 0){
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        }

        $output  = curl_exec($ch);

        // 释放句柄
        curl_close($ch);
        return json_decode($output, true);
    }



}
